/*
  SD card datalogger

 This example shows how to log data from three analog sensors
 to an SD card using the SD library.

 The circuit:
 * SD card attached to SPI bus as follows:
 ** UNO:  MOSI - pin 11, MISO - pin 12, CLK - pin 13, CS - pin 4 (CS pin can be
 changed) and pin #10 (SS) must be an output
 ** Mega:  MOSI - pin 51, MISO - pin 50, CLK - pin 52, CS - pin 4 (CS pin can be
 changed) and pin #52 (SS) must be an output
 ** Leonardo: Connect to hardware SPI via the ICSP header
                Pin 4 used here for consistency with other Arduino examples

 created  24 Nov 2010
 modified 9 Apr 2012 by Tom Igoe
 modified 16 Aug 2017  by Lambor Fang

 This example code is in the public domain.

 */

#include <SD.h>

// On the Ethernet Shield, CS is pin 4. Note that even if it's not
// used as the CS pin, the hardware CS pin (10 on most Arduino boards,
// 53 on the Mega) must be left as an output or the SD library
// functions will not work.
const int chipSelect = 43;

File dataFile;

void setup() {
    SerialUSB.print( "Initializing SD card..." );
    // make sure that the default chip select pin is set to
    // output, even if you don't use it:
    pinMode( SS, OUTPUT );

    // see if the card is present and can be initialized:
    if ( !SD.begin( chipSelect ) ) {
        SerialUSB.println( "Card failed, or not present" );
        // don't do anything more:
        while ( 1 )
            ;
    }
    SerialUSB.println( "card initialized." );

    // Open up the file we're going to log to!
    dataFile = SD.open( "datalog.txt", FILE_WRITE );
    if ( !dataFile ) {
        SerialUSB.println( "error opening datalog.txt" );
        // Wait forever since we cant write data
        while ( 1 )
            ;
    }
}

void loop() {
    // make a string for assembling the data to log:
    String dataString = "";

    // read three sensors and append to the string:
    for ( int analogPin = 0; analogPin < 3; analogPin++ ) {
        int sensor = analogRead( analogPin );
        dataString += String( sensor );
        if ( analogPin < 2 ) {
            dataString += ",";
        }
    }

    dataFile.println( dataString );

    // print to the serial port too:
    SerialUSB.println( dataString );

    // The following line will 'save' the file to the SD card after every
    // line of data - this will use more power and slow down how much data
    // you can read but it's safer!
    // If you want to speed up the system, remove the call to flush() and it
    // will save the file only every 512 bytes - every time a sector on the
    // SD card is filled with data.
    dataFile.flush();

    // Take 1 measurement every 500 milliseconds
    delay( 500 );
}
